package apuntes;

import java.util.ArrayList;
import java.util.Iterator;

import aima.core.search.framework.HeuristicFunction;

public class Heuristica implements HeuristicFunction {

	@Override
	public double h(Object state) {

		EstadoCoches estado = (EstadoCoches) state;
		
		ArrayList<Coche> coches = estado.getListaCoches();
		int salidaX = estado.getSolX();
		int salidaY = estado.getSolY();
		
		int posXCR = estado.getCoche().getX();
		int posYCR = estado.getCoche().getY();
		
		int puntuacion =  Math.abs(posXCR-salidaX)+Math.abs(posYCR-salidaY);	//da una puntuacion a la casilla donde esta el coche independientemente de los coches ke haya en su camino

		//		Ejemplo
		//                                 y
		//		- 0 1 2 3 4 5 6          x - 0 1 2 3 4 5 6
		//		0 9 8 7 6 5 4 3 x          0       R       x
		//		1 8 7 6 5 4 3 2 x          1               x
		//		2 7 6 5 4 3 2 1 x          2 ...           x
		//		3 R 5 4 3 2 1 0 salida     3 6 5 4 3 4 5 6 x
		//		4 6 6 5 4 3 2 1 x          4 5 4 3 2 3 4 5 x
		//		5 7 7 6 5 4 3 2 x          5 4 3 2 1 2 3 4 x
		//		6 8 8 7 6 5 4 3 x          6 3 2 1 0 1 2 3 x
		//		  x x x x x x x              x x x s x x x 

		//		ahora restar dependiendo de los coches que haya en medio
		int estaHorizontal = estado.getCoche().isHorizontal() ? 1 : 0;
		boolean haciaAtras;
		if (estado.getCoche().isHorizontal()) 
			haciaAtras = salidaY == 0; 
		else
			haciaAtras = salidaX == 0;
		
		for (Iterator<Coche> it = coches.iterator(); it.hasNext();){
			Coche actual = it.next();
			
			if (estado.getCoche().isHorizontal()) {
				if (haciaAtras){
					if (actual.getX() == posXCR && actual.getY() < posYCR) 
						puntuacion = puntuacion + actual.getLongitud()*estaHorizontal;
				} else {
					if (actual.getX() == posXCR && actual.getY() > posYCR) 
						puntuacion = puntuacion + actual.getLongitud()*estaHorizontal;
				}
			} else {
				if (haciaAtras){
					if (actual.getY() == posYCR && actual.getX() < posXCR) 
						puntuacion = puntuacion + actual.getLongitud()*estaHorizontal;
				} else {
					if (actual.getY() == posYCR && actual.getX() > posXCR) 
						puntuacion = puntuacion + actual.getLongitud()*estaHorizontal;
				}
			}
		}
		return puntuacion;
	}
}
